package com.mh.study.streams;

import java.util.stream.Stream;

/**
 * 执行顺序
 *
 * @author meng.han
 * @since 2022-01-17
 */
public class OrderExecution {

    private long counter;

    private void wasCalled() {
        counter++;
    }

    /**
     * <p>
     * 执行此代码将使计数器的值增加三, 这意味着我们调用了 3 次流的 map() 方法，但是 size 的值是 1。
     * 所以生成的流只有一个元素，我们无缘无故地执行了昂贵的 map() 操作，其中有 3 次。
     * </p>
     * <p>
     * 如果我们改变 skip() 和 map() 方法的顺序，计数器只会增加一。 所以我们只调用一次 map() 方法。
     * 见{@link #fastExe()}
     * </p>
     */
    public long slowlyExe() {
        counter = 0;
        Stream.of("abc1", "abc2", "abc3").map(element -> {
            wasCalled();
            return element.substring(0, 3);
        }).skip(2).count();
        return counter;
    }

    public long fastExe() {
        counter = 0;
        Stream.of("abc1", "abc2", "abc3")
                .skip(2)
                .map(element -> {
                    wasCalled();
                    return element.substring(0, 3);
                }).count();
        return counter;
    }
}
